#include <stdio.h>
#include <stdarg.h>

#include "xxx_info_log.h"

static void default_error_log(const char* str)
{
	fprintf(stderr, "%s", str);
	return;
}

static void default_debug_log(const char* str)
{
	fprintf(stdout, "%s", str);
	return;
}

static void default_info_log(const char* str)
{
	fprintf(stdout, "%s", str);
	return;
}

static XxxLogCallback* g_error_log_cb = default_error_log;
static XxxLogCallback* g_debug_log_cb = NULL;
static XxxLogCallback* g_info_log_cb = NULL;

void xxx_log_error(const char* format, ...) 
{
	char str[256] = {0};
	if (g_error_log_cb) {
	    va_list args;
	    va_start(args, format);
	    vsnprintf(str, sizeof(str), format, args);
	    g_error_log_cb(str);
	    va_end(args);
	}
}

void xxx_log_debug(const char* format, ...) 
{
	char str[256] = {0};
	if (g_debug_log_cb) {
	    va_list args;
	    va_start(args, format);
	    vsnprintf(str, sizeof(str), format, args);
	    g_debug_log_cb(str);
	    va_end(args);
	}
}

void xxx_log_info(const char* format, ...) 
{
	char str[256] = {0};
	if (g_info_log_cb) {
	    va_list args;
	    va_start(args, format);
	    vsnprintf(str, sizeof(str), format, args);
	    g_info_log_cb(str);
	    va_end(args);
	}
}


void xxx_set_error_callback(XxxLogCallback* func) 
{
	g_error_log_cb = func;
}

void xxx_set_debug_callback(XxxLogCallback* func) 
{
	g_debug_log_cb = func;
}

void xxx_set_info_callback(XxxLogCallback* func) 
{
	g_info_log_cb = func;
}

int main()
{
	int i = 0;
	xxx_log_error("aaaa %d %s\n", i, "aa");
	return 0;
}